/*!
 * \file frct_comm.h
 *
 * \brief ct共通信息
 *
 * All Rights Reserved Copyright (C) 2014 broada,Co.,Ltd.\n
 * ct管理用共通函数
 *
 * \version 2.0
 * \author yaohl
 * \date 2014/10/28
 *
 */

#ifndef __FRCT_COMM_H_
#define __FRCT_COMM_H_

#include "frcomm.h"
#include "frmem.h"
#include "frlist.h"
#include "conntrack.h"
#include "module.h"

#define FR_DIRECT_UNKNOWN        0x00      /* 该连接ip+端口 不能确定 */
#define FR_DIRECT_KNOWN          0x01      /* 该连接ip+端口 确定 */
#define FR_DIRECT_SRV2CLIENT     0x02      /* 该连接服务器->客户端 */
#define FR_DIRECT_CLIENT2SRV     0x03      /* 该连接客户端->服务器 */

#define FR_SRV_IP_PORT           0x04      /* 该连接ip+端口 服务端 */
#define FR_CLIENT_IP_PORT        0x05      /* 该连接ip+端口 客户端 */

/*!
 * 获取当前使用的L7_analyzer
 *
 * \param p_st_ct       (Conntrack *)
 *
 * \return L7_analyzer *
 *
 * \note 线程不安全
 *
 */
L7_analyzer *frct_get_L7analyzer(Conntrack *p_st_ct);

/*!
 * 获取L7_transaction
 *
 * \param p_st_ct      (Conntrack *)
 *
 * \return 返回L7_transaction指针
 *
 * \note 线程不安全
 *
 */
L7_transaction *frct_get_L7transaction(Conntrack *p_st_ct);

/*!
 * 获取session
 *
 * \param p_st_ct      (Conntrack *)
 *
 * \return 返回session
 *
 * \note 线程不安全
 *
 */
L7_session *frct_get_session(Conntrack *p_st_ct);

/*!
 * 获取session中保存的用户名
 *
 * \param p_st_session      (L7_session *)
 *
 * \return 返回session中的用户名
 *
 * \note 线程不安全
 *
 */
char *frct_get_session_username(L7_session *p_st_session);

/*!
 * 设定session中的用户名
 *
 * \param p_st_session      (L7_session *)
 * \param p_username        (用户名)
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 * \note 线程不安全,函数内部重新生成内存
 *
 */
int  frct_set_session_username(L7_session *p_st_session, const char *p_username);

/*!
 * 释放session中的用户名
 *
 * \param p_st_session      (L7_session *)
 *
 */
void frct_free_session_username(L7_session *p_st_session);

/*!
 * 获取session中保存的starttime
 *
 * \param p_st_session      (L7_session *)
 *
 * \return 返回session中的starttime指针
 *
 * \note 线程不安全
 *
 */
struct timeval *frct_get_session_starttime(L7_session *p_st_session);

/*!
 * 设定session中的starttime
 *
 * \param p_st_session      (L7_session *)
 * \param p_username        (用户名)
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 * \note 线程不安全
 *
 */
int frct_set_session_starttime(L7_session *p_st_session, struct timeval *p_st_starttime);

/*!
 * 获取session中保存的stoptime
 *
 * \param p_st_session      (L7_session *)
 *
 * \return 返回session中的stoptime指针
 *
 * \note 线程不安全
 *
 */
struct timeval *frct_get_session_stoptime(L7_session *p_st_session);

/*!
 * 设定session中的stoptime
 *
 * \param p_st_session      (L7_session *)
 * \param p_st_stoptime     (时间 struct timeval *)
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 * \note 线程不安全
 *
 */
int frct_set_session_stoptime(L7_session *p_st_session, struct timeval *p_st_stoptime);

/*!
 * 获取session中保存的private
 *
 * \param p_st_session      (L7_session *)
 *
 * \return 返回session中的private
 *
 * \note 线程不安全
 *
 */
void *frct_get_session_private(L7_session *p_st_session);

/*!
 * 设定session中的private
 *
 * \param p_st_session      (L7_session *)
 * \param p_session_private (void *)
 *
 * \return 0:成功\n
 *         1:失败\n
 *         2:p_session_private已经存在,设置失败
 *
 * \note 线程不安全
 *
 */
int frct_set_session_private(L7_session *p_st_session, void *p_session_private);

/*!
 * 获取session中保存的status
 *
 * \param p_st_session      (L7_session *)
 *
 * \return 返回session中的status指针
 *
 * \note 线程不安全
 *
 */
int *frct_get_session_status(L7_session *p_st_session);

/*!
 * 设定session中的i_status
 *
 * \param p_st_session      (L7_session *)
 * \param i_status          (状态)
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 * \note 线程不安全
 *
 */
int frct_set_session_status(L7_session *p_st_session, int i_status);

/*!
 * 释放L7_session
 *
 * \param p_st_session      (L7_session *)
 *
 * \note 线程不安全
 *
 */
void frl7session_free(L7_module *p_st_l7_module, L7_session *p_st_l7_session);

/*!
 * 释放L7_transaction
 *
 * \param p_st_l7_transaction      (L7_transaction *)
 *
 * \note 线程不安全
 *
 */
void frl7trans_free(L7_transaction *p_st_l7_transaction);

/*!
 * 获取ct上的方向确定标识
 *
 * \param p_st_ct      (Conntrack *)
 *
 * \return FR_DIRECT_UNKNOWN\n
 *         FR_DIRECT_KNOWN
 *
 */
int frct_get_direct_known(Conntrack *p_st_ct);

/*!
 * 判断是当前连接的服务端/客户端
 *
 * \param p_st_ct      (Conntrack *)
 * \param ui_ip        (ip)
 * \param us_port      (port)
 *
 * \return FR_SRV_IP_PORT\n
 *         FR_CLIENT_IP_PORT\n
 *         FR_DIRECT_UNKNOWN
 *
 * \note 
 *
 */
int frcap_get_cs_direction(Conntrack *p_st_ct, u_int ui_ip, u_short us_port);

/*!
 * 设置当前服务器的ip+port
 *
 * \param p_st_ct      (Conntrack *)
 * \param ui_srv_ip    (服务端 ip)
 * \param us_port      (服务端 port)
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 */
int frcap_set_cs_srv(Conntrack *p_st_ct, u_int ui_srv_ip, u_short us_srv_port);

/*!
 * 获取ct上的方向确定标识
 *
 * \param p_st_ct      (Conntrack *)
 *
 * \return FR_YES: 有关联父连接\n
 *         FR_NO:  没有关联父连接
 *
 */
int frct_has_master(Conntrack *p_st_ct);

/*!
 * 设置统计用原port,目的port
 *
 * \param p_st_ct      (Conntrack *)
 * \param src_port     (u_short)
 * \param dst_port     (u_short)
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 */
int frct_set_statIp(Conntrack *p_st_ct, u_short src_port, u_short dst_port);

/*!
 * 获取序列号
 *
 * \param p_st_ct      (Conntrack *)
 *
 * \return 序列号
 *
 */
unsigned long frct_seq_increase(Conntrack *p_st_ct);

/*!
 * 控制数据包丢弃
 *
 * \param p_st_ct      (Conntrack *)
 * \param s_drop_pcap  (数据包丢弃标识; 0:数据包不丢弃; 1:数据包丢弃)
 *
 *
 * \note: 已经进入主框架队列的数据包不丢弃
 */
void frct_drop_pcap(Conntrack *p_st_ct, short s_drop_pcap);

#endif
